package com.li.utils;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.Base64;
import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

/**
 * Author: Li
 * Date: 2017/4/13
 * Description:
 */

public class ImageUtil {

    /**
     * 选取本地图片
     * @param activity  需要跳转的界面
     * @param requestCode   请求码
     */
    public static void chooseLocaleImage(Activity activity, int requestCode){
        Intent intentFromLocal = new Intent(Intent.ACTION_PICK);
        intentFromLocal.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
        activity.startActivityForResult(intentFromLocal, requestCode);
    }

    /**
     * 拍照
     * @param activity  需要跳转的界面
     * @param requestCode   请求码
     * @param uri   图片存储的uri
     */
    public static void takePicture(Activity activity, int requestCode, Uri uri){
        Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        activity.startActivityForResult(intentCamera, requestCode);
    }

    /**
     * 裁剪
     * @param activity  跳转界面
     * @param fromUri   传入图片uri
     * @param outputUri 输出图片uri
     * @param requestCode   请求码
     * @param width 裁剪宽度
     * @param height    裁剪高度
     */
    public static void crop(Activity activity, Uri fromUri, Uri outputUri, int requestCode, int width, int height){
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(fromUri, "image/*");
        // 这段注释掉就不会跳转到裁剪的activity
        intent.putExtra("crop", "true");


        Log.e("tag", "crop: "+width+"|"+height);
        intent.putExtra("aspectX", width);
        intent.putExtra("aspectY", height);

        intent.putExtra("outputX", width);
        intent.putExtra("outputY", height);
        intent.putExtra("scale", false);
        // true的话直接返回bitmap，可能会很占内存 不建议
        intent.putExtra("return-data", false);
        // 上面设为false的时候将MediaStore.EXTRA_OUTPUT即"output"关联一个Uri
        // 看参数即可知道是输出格式

        intent.putExtra("output", outputUri);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

        // 想从Activity中获得返回数据，在启动Activity时候使用startActivityForResult方法
        // 1为请求代码，可以是任意值，个人感觉用资源id会比较清楚，而且不会重复 比如当前控件的R.id.button
        activity.startActivityForResult(intent, requestCode);
    }

    /**
     * 获取图片字节流
     * @param bitmap    图片
     * @return  字节流
     */
    public static String bitmapToBase64(Bitmap bitmap) {
        String photo = "";
        try {
            //将Bitmap转换成字节流
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
            byteArrayOutputStream.close();
            byte[] buffer = byteArrayOutputStream.toByteArray();
            //将图片的字节流数据加密成base64字符输出
            photo = Base64.encodeToString(buffer, 0, buffer.length, Base64.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return photo;
    }

    /**
     * 获取图片uri
     * @param context   上下文
     * @param imageFile 图片文件
     * @return  uri
     */
    public static Uri getImageContentUri(Context context, File imageFile) {
        String filePath = imageFile.getAbsolutePath();
        Cursor cursor = context.getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID},
                MediaStore.Images.Media.DATA + "=? ", new String[]{filePath}, null);
        if (cursor != null && cursor.moveToFirst()) {
            int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
            Uri baseUri = Uri.parse("content://media/external/images/media");

            cursor.close();
            return Uri.withAppendedPath(baseUri, "" + id);
        } else {
            if (imageFile.exists()) {
                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.DATA, filePath);
                if (cursor != null) {
                    cursor.close();
                }
                return context.getContentResolver().insert(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            } else {
                if (cursor != null) {
                    cursor.close();
                }
                return null;
            }
        }
    }

}
